package xhe.lib.base;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.util.StringUtils;

/**
 * <b> 工具类: </b> 通用方法类
 * 
 * @author xhe
 * @version V1.0.0.0
 * @version --2020年1月16日
 */
public class Common {

	/**
	 * <b> 方法: </b> 转换四舍五入的数字
	 * 
	 * @author xhe
	 * @param value   要转换的数值
	 * @param divisor 保留的小数位数
	 * @return double 转换后的数值
	 * @version V1.0.0.0
	 * @version --2020年1月5日
	 * @version --新增方法
	 */
	public static double getNumber(String value, int divisor) {
		double result = 0;

		try {
			if (divisor == 0) {
				result = new BigDecimal(Integer.valueOf(value)).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
			} else {
				result = new BigDecimal(Integer.valueOf(value) / divisor).setScale(2, BigDecimal.ROUND_HALF_UP)
						.doubleValue();
			}
		} catch (Exception ex) {

		}

		return result;
	}

	/**
	 * <b> 方法: </b> 将字符串转换数字
	 * 
	 * @author xhe
	 * @param value   要转换的数值
	 * @param safeNum 假如转换失败要替换的值
	 * @return int 转换后的数值
	 * @version V1.0.0.0
	 * @version --2020年1月5日
	 * @version --新增方法
	 */
	public static int toPraseInt(String value, int safeNum) {
		int result = safeNum;

		try {

			BigDecimal bd = new BigDecimal(value);
			bd = bd.setScale(0, RoundingMode.HALF_UP); // 四舍五入保留0位小数即整数

			result = Integer.valueOf(bd.intValue());

		} catch (Exception ex) {
			result = safeNum;
		}

		return result;
	}

	/**
	 * <b> 方法: </b> 将字符串转换数字
	 * 
	 * @author xhe
	 * @param value   要转换的数值
	 * @param safeNum 假如转换失败要替换的值
	 * @return int 转换后的数值
	 * @version V1.0.0.0
	 * @version --2020年1月5日
	 * @version --新增方法
	 */
	public static Long toPraseLong(String value, int safeNum) {
		Long result = Long.valueOf(safeNum);

		try {

			BigDecimal bd = new BigDecimal(value);
			bd = bd.setScale(0, RoundingMode.HALF_UP); // 四舍五入保留0位小数即整数

			result = Long.valueOf(bd.longValue());

		} catch (Exception ex) {
			result = Long.valueOf(safeNum);
		}

		return result;
	}

	/**
	 * <b> 方法: </b> 将字符串转换小数
	 * 
	 * @author xhe
	 * @param value   要转换的数值
	 * @param safeNum 假如转换失败要替换的值
	 * @return double 转换后的数值
	 * @version V1.0.0.0
	 * @version --2020年1月14日
	 * @version --新增方法
	 */
	public static double toPraseDouble(String value, double safeNum) {
		double result = safeNum;

		try {
			result = Double.valueOf(value);
		} catch (Exception ex) {
			result = safeNum;
		}

		return result;
	}

	/**
	 * <b> 方法: </b> 将字符串转换小数
	 * 
	 * @author xhe
	 * @param value   要转换的数值
	 * @param safeNum 假如转换失败要替换的值
	 * @return double 转换后的数值
	 * @version V1.0.0.0
	 * @version --2020年1月14日
	 * @version --新增方法
	 */
	public static BigDecimal toPraseDecimal(String value, double safeNum) {
		BigDecimal result = BigDecimal.valueOf(safeNum);

		try {
			result = new BigDecimal(value);
		} catch (Exception ex) {
			result = BigDecimal.valueOf(safeNum);
		}

		return result;
	}

	/**
	 * <b> 方法: </b> 将字符串转换布尔值:Y\N\T\F\true\false\1\0,不区分大小写
	 * 
	 * @author xhe
	 * @param value     要转换的数值
	 * @param safeValue 假如转换失败要替换的值
	 * @return Boolean 转换后的布尔值
	 * @version V1.0.0.0
	 * @version --2020年5月21日
	 * @version --新增方法
	 */
	public static Boolean toPraseBoolean(Object value, Boolean safeValue) {
		Boolean result = false;

		try {

			if (value.toString().toLowerCase().equals("t")) {
				result = true;
			} else if (value.toString().toLowerCase().equals("true")) {
				result = true;
			} else if (value.toString().toLowerCase().equals("y")) {
				result = true;
			} else if (value.toString().toLowerCase().equals("1")) {
				result = true;
			}
		} catch (Exception ex) {
			result = safeValue;
		}

		return result;
	}

	/**
	 * <b> 方法: </b> 将字符串转换日期
	 * 
	 * @author xhe
	 * @param value  要转换的数值
	 * @param format 格式化的值(yyyy-MM-dd HH:mm:ss)
	 * @return Date 转换后的日期
	 * @version V1.0.0.0
	 * @version --2020年1月14日
	 * @version --新增方法
	 */
	public static Date toPraseDate(String value, String format) {
		Date result = null;

		try {
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
			result = simpleDateFormat.parse(value);
		} catch (Exception ex) {
		}

		return result;
	}

	/**
	 * <b> 方法: </b> 使用默认值替换Empty或null值
	 * 
	 * @author xhe
	 * @param value   原始的值
	 * @param replace 要替换的值
	 * @return String 替换后的值
	 * @version V1.0.0.0
	 * @version --2020年1月5日
	 * @version --新增方法
	 */
	public static String isNullEmpty(String value, String replace) {
		try {
			if (value == null) {
				return replace;
			} else if (StringUtils.isEmpty(value)) {
				return replace;
			} else if (value.toLowerCase() == "null") {
				return replace;
			} else {
				value = value.replaceAll("\r", "").replaceAll("\n", "");
				return value;
			}
		} catch (Exception e) {
			return value;
		}
	}

	/**
	 * <b> 方法: </b> 根据key获取指定支字符串的value值
	 * 
	 * @author xhe
	 * @param key          指定的key
	 * @param formatValues 指定的字符串
	 * @return String 匹配的value
	 * @version V1.0.0.0
	 * @version --2020年5月8日
	 * @version --新增方法
	 */
	public static String toFormat(String key, String formatValues) {
		try {
			String[] strFormats = formatValues.split("\\|");

			for (String strFormat : strFormats) {
				String strKey = strFormat.split(":")[0].toString();
				String strValue = strFormat.split(":")[1].toString();

				if (key.equals(strKey)) {
					key = strValue;
					break;
				}
			}

			return key;
		} catch (Exception e) {
			return key;
		}
	}

	/**
	 * <b> 方法: </b> 根据key获取指定支字符串的value值
	 * 
	 * @author xhe
	 * @param key          指定的key
	 * @param formatValues 指定的字符串
	 * @return String 匹配的value
	 * @version V1.0.0.0
	 * @version --2020年9月22日
	 * @version --新增方法
	 */
	public static String toArrayFormat(String value, String formatValues) {
		try {
			String[] strFormats = formatValues.split("\\|");

			for (String strFormat : strFormats) {
				String strKey = strFormat.split(":")[0].toString();
				String strValue = strFormat.split(":")[1].toString();

				value = value.replace("\"" + strKey + "\"", "\"" + strValue + "\"");
			}

			return value;
		} catch (Exception e) {
			return value;
		}
	}

	/**
	 * <b> 方法: </b> 对特殊字符进行转义
	 * 
	 * @author xhe
	 * @param value 要转义的字符串
	 * @return String 转义后的value
	 * @version V1.0.0.0
	 * @version --2020年7月27日
	 * @version --新增方法
	 */
	public static String toParaphrase(String value) {
		try {
			value = value.replace("\"", "&#92;&quot;");
			value = value.replace("<", "&lt;");
			value = value.replace(">", "&gt;");
			value = value.replace("$", "&#36;");
			value = value.replace("%", "&#37;");
			value = value.replace("'", "&#39;");
			value = value.replace("(", "&#40;");
			value = value.replace(")", "&#41;");
			value = value.replace("*", "&#42;");
			value = value.replace("+", "&#43;");
			value = value.replace("-", "&#45;");
			value = value.replace("/", "&#47;");
			value = value.replace("[", "&#91;");
			value = value.replace("]", "&#93;");
			value = value.replace("{", "&#123;");
			value = value.replace("}", "&#125;");

			return value;
		} catch (Exception e) {
			return value;
		}
	}

	/**
	 * <b> 方法: </b> 对字符进行反转义
	 * 
	 * @author xhe
	 * @param value 要反转义的字符串
	 * @return String 反转义后的value
	 * @version V1.0.0.0
	 * @version --2020年7月27日
	 * @version --新增方法
	 */
	public static String toAntisense(String value) {
		try {
			System.out.println("Before:" + value);

			value = value.replace("&quot;", "\"");
			value = value.replace("&lt;", "<");
			value = value.replace("&gt;", ">");
			value = value.replace("&#36;", "$");
			value = value.replace("&#37;", "%");
			value = value.replace("&#39;", "'");
			value = value.replace("&#40;", "(");
			value = value.replace("&#41;", ")");
			value = value.replace("&#42;", "*");
			value = value.replace("&#43;", "+");
			value = value.replace("&#45;", "-");
			value = value.replace("&#47;", "/");
			value = value.replace("&#91;", "[");
			value = value.replace("&#92;", "\\");
			value = value.replace("&#93;", "]");
			value = value.replace("&#123;", "{");
			value = value.replace("&#125;", "}");

			return value;
		} catch (Exception e) {
			return value;
		}
	}
}
